package com.zhyt.intelligentpipeline.util.calc;

public class ResidualStrength {


    /**
     * 计算腐蚀管道的失效压力 P(f)
     * 管道外径、管道壁厚、腐蚀缺陷深度、腐蚀缺陷长度、
     * @param pipeNominalWallThickness 管道公称壁厚  t
     * @param tensileStrength 标准中规定的最小拉伸强度 SMTS
     * @param corrosionDefectDepth 腐蚀缺陷深度      l
     * @param pipeOuterDiameter 管道外径            D
     * @param defectLength 缺陷长度                 d
     *
     * 计算公式：
     *       Pf = (numericalValue)/(denominatorValue)
     *       numericalValue = 2 * t * SMTS * (1 - (d/t))
     *       denominatorValue  = (D - t) * (1 - d / (t * Q))
     *
     * */
    public static double getFailurePressure(double pipeNominalWallThickness, double tensileStrength,
                                             double corrosionDefectDepth, double pipeOuterDiameter,
                                             double defectLength){
        double numericalValue = 2 * pipeNominalWallThickness * tensileStrength * (1 - (corrosionDefectDepth / pipeNominalWallThickness));
        double denominatorValue = (pipeOuterDiameter - pipeNominalWallThickness) * (1 - (defectLength / (pipeNominalWallThickness * getLengthCorrection(defectLength,pipeOuterDiameter,pipeNominalWallThickness))));

        return numericalValue / denominatorValue;
    }

    /**
     * 计算长度校准系数
     * @param defectLength 缺陷长度
     * @param pipeOuterDiameter 管道外径
     * @param pipeNominalWallThickness 管道公称壁厚
     * 这里对数据进行开平方需要知道数据的精度
     *   计算公式：
     *       Q = sqrt(value,2)
     *       value  = 1 + 0.3 *
     * */
    public static double getLengthCorrection(double defectLength, double pipeOuterDiameter,
                                             double pipeNominalWallThickness){
        return Math.sqrt(defectLength + 0.3 * defectLength * Math.pow( defectLength / Math.sqrt(pipeOuterDiameter * pipeNominalWallThickness),2));
    }

    /**
     * 计算腐蚀管道的安全工作压力:
     * F1,F2 传入参数如果小于 0 则使用默认值
     * 公式：
     *      P(sw) = F * P(f)
     *      F为总使用系数
     *          F = F(1) * F(2)
     *              F(1) : 模型系数，通常取0.9
     *              F(2) : 操作使用系数是为保证含缺陷管道运行中能有一个安全裕度，取值通常与管道设计系数相等，一般取值为0.72。
     * @param F1 模型系数，通常取0.9
     * @param F2 操作使用系数是为保证含缺陷管道运行中能有一个安全裕度，取值通常与管道设计系数相等，一般取值为0.72。
     * */
    public static double getSafeWorkingPressure(double F1, double F2,double pipeNominalWallThickness, double tensileStrength,
                                                double corrosionDefectDepth, double pipeOuterDiameter,
                                                double defectLength){
        //计算总使用系数
        F1 = F1 < 0 ? 0.9 : F1;
        F2 = F2 < 0 ? 0.72 : F2;
        double F = F1 * F2;
        return   F * getFailurePressure(pipeNominalWallThickness,tensileStrength,corrosionDefectDepth,pipeOuterDiameter,defectLength);
    }

    /**
     * 计算精度
     * @param value 传入数值
     * */
    public static double[] decimalPlaces(double value){
        return null;
    }
}
